package com.yay.warehouse.service;

import android.app.Activity;
import android.content.Context;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationManager;

import java.io.IOException;
import java.util.List;
import java.util.Locale;
import java.util.Timer;
import java.util.TimerTask;
import android.location.LocationListener;
import android.os.Bundle;
import android.util.Log;


/**
 * Get Started!
 * @author yakovlev.yuriy@gmail.com
 * @author Dmitry Makeev
 */
public class LocationService extends Activity {
	private Timer timer1;
	private LocationManager lm;
	private LocationResult locationResult;
	boolean gps_enabled=false;
	boolean network_enabled=false;

	
	public boolean getLocation(Context context, LocationResult result) {
		locationResult=result;
	    if(lm == null) {
	    	lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
	    }

	    //exceptions will be thrown if provider is not permitted.
	    try{gps_enabled=lm.isProviderEnabled(LocationManager.GPS_PROVIDER);}catch(Exception ex){}
	    try{network_enabled=lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);}catch(Exception ex){}

	    //don't start listeners if no provider is enabled
	    if(!gps_enabled && !network_enabled) {
	    	return false;
	    }

        if(gps_enabled) {
        	lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps);
        }
	    if(network_enabled) {
	    	lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork);
	    }
	    timer1=new Timer();
	    timer1.schedule(new GetLastLocation(), 20000);
	    return true;
	}

	LocationListener locationListenerGps = new LocationListener() {
		public void onLocationChanged(Location location) {
			timer1.cancel();
	        locationResult.gotLocation(location);
	        lm.removeUpdates(this);
	        lm.removeUpdates(locationListenerNetwork);
	    }
	    public void onProviderDisabled(String provider) {}
	    public void onProviderEnabled(String provider) {}
	    public void onStatusChanged(String provider, int status, Bundle extras) {}
	};

	LocationListener locationListenerNetwork = new LocationListener() {
	    public void onLocationChanged(Location location) {
	    	timer1.cancel();
	        locationResult.gotLocation(location);
	        lm.removeUpdates(this);
	        lm.removeUpdates(locationListenerGps);
	    }
	    public void onProviderDisabled(String provider) {}
	    public void onProviderEnabled(String provider) {}
	    public void onStatusChanged(String provider, int status, Bundle extras) {}
	};

	class GetLastLocation extends TimerTask {
		@Override
	    public void run() {
			lm.removeUpdates(locationListenerGps);
	        lm.removeUpdates(locationListenerNetwork);

            Location net_loc=null, gps_loc=null;
            if(gps_enabled) {
            	gps_loc=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
            }
	        if(network_enabled) {
	        	net_loc=lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
	        }

            //if there are both values use the latest one
            if(gps_loc!=null && net_loc!=null) {
            	if(gps_loc.getTime() > net_loc.getTime()) {
            		locationResult.gotLocation(gps_loc);
            	} else {
                    locationResult.gotLocation(net_loc);
            	}
	            return;
	        }

	        if(gps_loc != null) {
	        	locationResult.gotLocation(gps_loc);
	            return;
	        }
	        if(net_loc != null) {
	            locationResult.gotLocation(net_loc);
	            return;
	        }
	        locationResult.gotLocation(null);
		}
	}

	public static abstract class LocationResult{
		public abstract void gotLocation(Location location);
	}
	
	public static String getAddress(Context context, double latitude, double longitude) {
		 String ret = "";
		 if(L10N.debug && latitude == 0 && longitude == 0) { // debug
			 latitude = 48.463602*1E6;
			 longitude = 35.054584*1E6;
		 } 
		 Geocoder geoCoder = new Geocoder(context, Locale.getDefault());
        try {
            List<Address> addresses = geoCoder.getFromLocation(latitude/1E6, longitude/1E6, 1);
            if(addresses.size() > 0) {
                for(int i=0; i<addresses.get(0).getMaxAddressLineIndex(); i++) {
                   ret += addresses.get(0).getAddressLine(i) + "\n";
                }
            }
        } catch(IOException e) {                
   	        Log.e(LocationService.class.getName(), e.toString());
        }
        return ret;
	 }
	
}
